import { getNewCartGoods } from "@/api/cart"

// 购物车模块
export default {
  namespaced: true,
  state: () => {
    return {
      // 购物车商品列表
      list: []
    }
  },
  getters: {
    // 有效商品列表
    validList (state) {
      // 库存大于0，库存有效标识为true
      return state.list.filter(goods => goods.stock > 0 && goods.isEffective)
    },
    // 有效商品总件数
    validTotal (state, getters) {
      return getters.validList.reduce((p, c) => p + c.count, 0)
    },
    // 有效商品总金额
    validAmount (state, getters) {
      return getters.validList.reduce((p, c) => p + c.count * 100 * c.nowPrice, 0) / 100
    },
    // 无效商品列表
    invalidList (state) {
      return state.list.filter(goods => goods.stock <= 0 || !goods.isEffective)
    },
    // 已选商品列表
    selectedList (state, getters) {
      return getters.validList.filter(item => item.selected)
    },
    // 已选商品总件数
    selectedTotal (state, getters) {
      return getters.selectedList.reduce((p, c) => p + c.count, 0)
    },
    // 已选商品总金额
    selectedAmount (state, getters) {
      return getters.selectedList.reduce((p, c) => p + Math.round(c.count * 100) * c.nowPrice, 0) / 100
    },
    // 是否全选
    isCheckedAll (state, getters) {
      return getters.validList.length !== 0 && getters.selectedList.length === getters.validList.length
    }
  },
  mutations: {
    // 加入购物车
    addToCart (state, payload) {
      // 约定加入购物车字段，和后端保持一致
      // 插入数据规则：
      // 1.先查找是否有相同商品
      // 2.如果有相同，先取它的数量，然后删除原来的商品，再将数量累加到payload，再保存
      // 3.如果没有不相同，直接保存
      const sameIndex = state.list.findIndex(goods => goods.skuId === payload.skuId)
      // 有相同的商品
      if (sameIndex > -1) {
        // 取它的数量
        const count = state.list[sameIndex].count
        // 累加数量到payload
        payload.count += count
        // 删除原有商品
        state.list.splice(sameIndex, 1)
      }
      // 加上商品
      state.list.unshift(payload)
    },
    // 修改购物车商品
    updateCart (state, goods) {
      // goods商品对象的字段不固定，对象中有哪些字段就改哪些字段
      // 字段的值合理才能改
      // goods商品对象的字段必须有skuId
      const updateGoods = state.list.find(item => item.skuId === goods.skuId)
      for (const key in goods) {
        if (goods[key] !== undefined && goods[key] !== null && goods[key] !== '') {
          updateGoods[key] = goods[key]
        }
      }
    },
    // 删除购物车商品
    deleteCart (state, skuId) {
      const index = state.list.findIndex(item => item.skuId === skuId)
      state.list.splice(index, 1)
    }
  },
  actions: {
    // 加入购物车
    addToCart (ctx, payload) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 1. 已登录
        } else {
          // 2.未登录
          ctx.commit('addToCart', payload)
          resolve()
        }
      })
    },
    // 获取商品列表
    getCart (ctx) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 已登录
        } else {
          // 未登录
          // 同时发送请求，所以请求成功，才一起去修改本地数据
          const promiseArr = ctx.state.list.map(goods => {
            return getNewCartGoods(goods.skuId)
          })
          // dataList 成功结果的集合，数据顺序和promiseArr顺序一致，它由state.list而来
          Promise.all(promiseArr).then(dataList => {
            // 更新本地购物车
            dataList.forEach((data, i) => {
              ctx.commit('updateCart', { skuId: ctx.state.list[i].skuId, ...data.result })
            })
            // 调用resolve代表成功
            resolve()
          })
        }
      })
    },
    // 删除购物车商品
    deleteCart (ctx, payload) {
      // payload是skuId
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 已登录
        } else {
          // 未登录
          ctx.commit('deleteCart', payload)
          resolve()
        }
      })
    },
    // 修改购物车(单选框选中和数量改变)
    updateCart (ctx, payload) {
      // payload 需要：必需skuId，可能：selected、count
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 已登录
        } else {
          // 未登录
          ctx.commit('updateCart', payload)
          resolve()
        }
      })
    },
    // 全选和取消全选
    checkAllCart (ctx, selected) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 已登录
        } else {
          // 未登录
          ctx.getters.validList.forEach(goods => {
            ctx.commit('updateCart', { skuId: goods.skuId, selected })
          })
          resolve()
        }
      })
    },
    // 批量删除
    batchDeleteCart (ctx, isClear) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 已登录
        } else {
          // 未登录
          // 找出选中的商品，遍历调用删除的mutations
          // isClear 为 true 时，删除失效商品列表，否则删除选中商品列表
          ctx.getters[isClear ? 'invalidList' : 'selectedList'].forEach(item => {
            ctx.commit('deleteCart', item.skuId)
          })
          resolve()
        }
      })
    }
  }
}
